package capaNegocio;

import java.io.Serializable;
import org.openstreetmap.gui.jmapviewer.Coordinate;

import capaGrafica.Fecha;

public class PedidoCliente implements Serializable, Comparable<PedidoCliente>{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private String nombreCliente;
	private Fecha fechaEntrega;
	private Coordinate coordenada;
	private boolean fueVisitado;
	private double idCliente;
	
	public PedidoCliente(String n, Coordinate coord, Fecha fecha)
	{
		nombreCliente = n;
		coordenada= coord;
		fueVisitado= false;
		fechaEntrega= fecha;
		Inteligencia.setIdCliente();
		idCliente= Inteligencia.getIdCliente();
	}
	
	public static double distanciaEntrePedidos(PedidoCliente pedido1, PedidoCliente pedido2){
		return getDistancia(pedido1.coordenada, pedido2.coordenada);
	}
	
	public double distanciaConOtroPedido (PedidoCliente otro){
		return getDistancia(this.coordenada, otro.coordenada);
	}
	
	public Coordinate dameCordenada(){
		return coordenada;
	}
	
	public boolean seEnvioPedido(){
		return fueVisitado;
	}
	
	public void pedidoEntregado(){
		fueVisitado= true;
	}

	public String dameNombreCliente(){
		return nombreCliente;
	}
	
	
	public static double getDistancia (Coordinate x, Coordinate y){
		double latitudX= x.getLat();
		double longitudX= x.getLon();
		
		double latitudY= y.getLat();
		double longitudY= y.getLon();
		
		double earthRadius = 6371;//kilometers  
		double dLat;
		double dLng;
		if (latitudX >= latitudY){
			dLat = Math.toRadians(latitudX - latitudY);  
		}else {
			dLat = Math.toRadians(latitudY - latitudX);
		}
		
		if (longitudX >= longitudY){
			dLng = Math.toRadians(longitudX - longitudY);  
		}else {
			dLng = Math.toRadians(longitudY - longitudX);  
		}
        
        double sindLat = Math.sin(dLat / 2);  
        double sindLng = Math.sin(dLng / 2);  
        double a = Math.pow(sindLat, 2) + Math.pow(sindLng, 2)  
                * Math.cos(Math.toRadians(latitudX)) * Math.cos(Math.toRadians(latitudY));  
        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));  
        double dist = earthRadius * c;  
  
        return dist;  
	}
	
	public static void main(String[] args) {
	}

	public Fecha getFecha() {
		return fechaEntrega;
	}
	
	public double getId(){
		return idCliente;
	}

	@Override
	public int compareTo(PedidoCliente arg0) {
		int ret;
		if(this.idCliente > arg0.idCliente){
			ret = 1;
		}else if(this.idCliente < arg0.idCliente){
			ret =-1;
		}else{
			ret = 0;
		}
		
		return ret;

	}

	@Override
	public String toString() {
		return "" + nombreCliente
				+ "  "+ fechaEntrega ;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((coordenada == null) ? 0 : coordenada.hashCode());
		result = prime * result
				+ ((fechaEntrega == null) ? 0 : fechaEntrega.hashCode());
		result = prime * result + (fueVisitado ? 1231 : 1237);
		long temp;
		temp = Double.doubleToLongBits(idCliente);
		result = prime * result + (int) (temp ^ (temp >>> 32));
		result = prime * result
				+ ((nombreCliente == null) ? 0 : nombreCliente.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		PedidoCliente other = (PedidoCliente) obj;
		if (coordenada == null) {
			if (other.coordenada != null)
				return false;
		} else if (!coordenada.equals(other.coordenada))
			return false;
		if (fechaEntrega == null) {
			if (other.fechaEntrega != null)
				return false;
		} else if (!fechaEntrega.equals(other.fechaEntrega))
			return false;
		if (fueVisitado != other.fueVisitado)
			return false;
		if (Double.doubleToLongBits(idCliente) != Double
				.doubleToLongBits(other.idCliente))
			return false;
		if (nombreCliente == null) {
			if (other.nombreCliente != null)
				return false;
		} else if (!nombreCliente.equals(other.nombreCliente))
			return false;
		return true;
	}
	
}
